#!/bin/bash

# 服务器部署文件打包脚本
echo "📦 开始打包服务器部署文件..."

# 设置变量
PACK_DIR="xlcig-api-server"
ARCHIVE_NAME="xlcig-api-server-$(date +%Y%m%d-%H%M%S).tar.gz"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log() {
    echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}"
}

warn() {
    echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}"
}

error() {
    echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}"
}

# 检查必要文件
check_files() {
    log "检查必要文件..."
    
    if [ ! -d "dist" ]; then
        error "dist 目录不存在，请先运行 npm run build"
        exit 1
    fi
    
    if [ ! -f "dist/app.js" ]; then
        error "dist/app.js 不存在，请检查编译结果"
        exit 1
    fi
    
    required_files=(
        "package.json"
        "package-lock.json"
        "Dockerfile.server"
        "docker-compose.server.yml"
        "nginx.conf"
        "server-deploy.sh"
        "ssl-setup.sh"
        "SERVER-DEPLOY-GUIDE.md"
    )
    
    for file in "${required_files[@]}"; do
        if [ ! -f "$file" ]; then
            error "缺少必要文件: $file"
            exit 1
        fi
    done
    
    log "所有必要文件检查通过"
}

# 创建打包目录
create_pack_directory() {
    log "创建打包目录..."
    
    # 清理旧的打包目录
    rm -rf "$PACK_DIR"
    
    # 创建新的打包目录
    mkdir -p "$PACK_DIR"
    
    log "打包目录创建完成"
}

# 复制文件
copy_files() {
    log "复制文件到打包目录..."
    
    # 复制编译后的代码
    cp -r dist/ "$PACK_DIR/"
    log "✓ 复制 dist/ 目录"
    
    # 复制数据库文件（如果存在）
    if [ -d "database" ]; then
        cp -r database/ "$PACK_DIR/"
        log "✓ 复制 database/ 目录"
    fi
    
    # 复制配置文件
    cp package.json "$PACK_DIR/"
    cp package-lock.json "$PACK_DIR/"
    log "✓ 复制 package 文件"
    
    # 复制 Docker 配置
    cp Dockerfile.server "$PACK_DIR/"
    cp docker-compose.server.yml "$PACK_DIR/"
    log "✓ 复制 Docker 配置文件"
    
    # 复制 Nginx 配置
    cp nginx.conf "$PACK_DIR/"
    log "✓ 复制 Nginx 配置文件"
    
    # 复制部署脚本
    cp server-deploy.sh "$PACK_DIR/"
    cp ssl-setup.sh "$PACK_DIR/"
    log "✓ 复制部署脚本"
    
    # 复制说明文档
    cp SERVER-DEPLOY-GUIDE.md "$PACK_DIR/"
    log "✓ 复制部署说明文档"
    
    # 设置脚本执行权限
    chmod +x "$PACK_DIR/server-deploy.sh"
    chmod +x "$PACK_DIR/ssl-setup.sh"
    log "✓ 设置脚本执行权限"
}

# 生成部署说明
generate_readme() {
    log "生成部署说明..."
    
    cat > "$PACK_DIR/README.md" << 'EOF'
# 装机指南 API 服务器部署包

## 📋 文件清单

- `dist/` - 编译后的应用代码
- `database/` - 数据库文件（如果存在）
- `package.json` - 项目依赖配置
- `Dockerfile.server` - Docker 配置
- `docker-compose.server.yml` - Docker Compose 配置
- `nginx.conf` - Nginx 配置
- `server-deploy.sh` - 自动部署脚本
- `ssl-setup.sh` - SSL 证书配置脚本
- `SERVER-DEPLOY-GUIDE.md` - 详细部署指南

## 🚀 快速部署

1. 上传整个目录到服务器 `/opt/xlcig-api/`
2. 在服务器上执行：`chmod +x *.sh && ./server-deploy.sh`
3. 配置 SSL：`./ssl-setup.sh`

更多详细信息请查看 `SERVER-DEPLOY-GUIDE.md`
EOF

    log "✓ 生成部署说明完成"
}

# 创建压缩包
create_archive() {
    log "创建压缩包..."
    
    tar -czf "$ARCHIVE_NAME" "$PACK_DIR/"
    
    if [ $? -eq 0 ]; then
        log "✓ 压缩包创建成功: $ARCHIVE_NAME"
    else
        error "压缩包创建失败"
        exit 1
    fi
}

# 显示文件信息
show_pack_info() {
    log "打包完成！"
    echo ""
    echo -e "${BLUE}📦 打包信息${NC}"
    echo "• 打包目录: $PACK_DIR"
    echo "• 压缩包: $ARCHIVE_NAME"
    echo "• 文件大小: $(du -h $ARCHIVE_NAME | cut -f1)"
    echo ""
    
    echo -e "${YELLOW}📂 目录结构:${NC}"
    tree "$PACK_DIR" 2>/dev/null || find "$PACK_DIR" -type f | sort
    echo ""
    
    echo -e "${YELLOW}🚀 上传到服务器:${NC}"
    echo "scp $ARCHIVE_NAME root@your-server-ip:/opt/"
    echo ""
    echo -e "${YELLOW}📋 服务器端操作:${NC}"
    echo "cd /opt && tar -xzf $ARCHIVE_NAME"
    echo "cd xlcig-api-server && chmod +x *.sh"
    echo "./server-deploy.sh"
    echo ""
}

# 清理临时文件
cleanup() {
    log "清理临时文件..."
    rm -rf "$PACK_DIR"
    log "清理完成"
}

# 主执行流程
main() {
    log "开始打包流程..."
    
    check_files
    create_pack_directory
    copy_files
    generate_readme
    create_archive
    show_pack_info
    cleanup
    
    log "打包流程完成！"
}

# 执行主函数
main "$@" 